package com.house.enhance;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ValueFilter;

import java.util.HashMap;

/**
 * @Description: 微信返回VO
 * @Author: ArvinWoo
 * @Date: 2022/9/21 11:41
**/
public class WeChatVo extends HashMap<String, Object>{
    private static final long serialVersionUID = 1L;

    /** 状态码 */
    public static final String CODE_TAG = "ErrorCode";

    /** 返回内容 */
    public static final String MSG_TAG = "ErrorMsg";

    /** 数据对象 */
    public static final String DATA_TAG = "Result";

    /**
     * 状态类型
     */
    public static enum Type{
        /** 错误 */
        ERROR(0),
        /** 成功 */
        SUCCESS(1),
        /** 警告 */
        WARN(2),
        INFO3(3),
        INFO4(4),
        INFO5(5),
        INFO6(6),
        INFO7(7),
        INFO8(8),
        INFO9(9);

        private final int value;

        Type(int value){
            this.value = value;
        }

        public int value(){
            return this.value;
        }
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象，使其表示一个空消息。
     */
    public WeChatVo(){
    }

    /**
     * @Description: 通用处理 ToJSONString
     * @Author: ArvinWoo
     * @Date: 2022/9/30 15:18
     * @MethodName: LocalToJSONString
     * @Return: java.lang.String
    **/
    public static String LocalToJSONString(Object data){
        return JSON.toJSONString(data,valueFilter,
                    SerializerFeature.WriteMapNullValue, // 保留map空的字段
                    SerializerFeature.WriteNullStringAsEmpty,// 将String类型的null转成""
                    SerializerFeature.WriteNullNumberAsZero, // 将Number类型的null转成0
                    SerializerFeature.WriteNullListAsEmpty, // 将List类型的null转成[]
                    SerializerFeature.WriteNullBooleanAsFalse, // 将Boolean类型的null转成false
                    SerializerFeature.WriteDateUseDateFormat,  //日期格式转换
                    SerializerFeature.DisableCircularReferenceDetect // 避免循环引用
                );
    }

    /**
     * 将空值 null 转 ""
     */
    private static final ValueFilter valueFilter = (obj, s, v) -> {
        return v == null ? "" : v;
    };

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg 返回内容
     * @param data 数据对象
     */
    public WeChatVo(Type type, String msg, Object data){
//        JSONObject resultObj = new JSONObject();
        super.put(CODE_TAG, type.value);
        super.put(MSG_TAG, msg);
        super.put(DATA_TAG, LocalToJSONString(data));
//        super.put("d", LocalToJSONString(resultObj));
    }

    /**
     * 初始化一个新创建的 AjaxResult 对象
     *
     * @param type 状态类型
     * @param msg 返回内容
     * @param data 数据对象
     */
    public WeChatVo(Type type, String msg, Object data,boolean d){
        if(d){
            JSONObject resultObj = new JSONObject();
            resultObj.put(CODE_TAG, type.value);
            resultObj.put(MSG_TAG, msg);
            resultObj.put(DATA_TAG, LocalToJSONString(data));
            super.put("d", LocalToJSONString(resultObj));
        }else{
            super.put(CODE_TAG, type.value);
            super.put(MSG_TAG, msg);
            super.put(DATA_TAG, data);
        }
    }

    public static WeChatVo success(String msg, Object data){
        return new WeChatVo(Type.SUCCESS, msg, data);
    }

    public static WeChatVo warn(String msg, Object data){
        return new WeChatVo(Type.WARN, msg, data);
    }

    public static WeChatVo error(String msg, Object data){
        return new WeChatVo(Type.ERROR, msg, data);
    }

    public static WeChatVo info(Type code ,String msg, Object data){
        return new WeChatVo(code, msg, data);
    }

    public static WeChatVo fileSuccess(Object data){
        return new WeChatVo(Type.ERROR, "success", data,false);
    }

    public static WeChatVo success(String msg, Object data,boolean d){
        return new WeChatVo(Type.SUCCESS, msg, data,d);
    }

    public static WeChatVo error(String msg, Object data,boolean d){
        return new WeChatVo(Type.ERROR,msg, data,d);
    }

    public static WeChatVo warn(String msg, Object data,boolean d){
        return new WeChatVo(Type.WARN, msg, data,d);
    }



}
